/*-------------------------------------------------------------------------
 *
 * win32common.c
 *	  win32*.c 端口之间共享的公共例程。
 *
 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  src/port/win32common.c
 *
 *-------------------------------------------------------------------------
 */

#ifdef FRONTEND
#include "postgres_fe.h"
#else
#include "postgres.h"
#endif

#ifdef WIN32

/*
 * pgwin32_get_file_type
 *
 * 这是一个 GetFileType() 的便捷包装器，具有所有端口实现的特定错误处理。返回与 HANDLE 相关联的文件类型。
 *
 * 在错误发生时，将 errno 设置为 FILE_TYPE_UNKNOWN 作为文件类型。
 */
DWORD pgwin32_get_file_type(HANDLE hFile)
{
	DWORD		fileType = FILE_TYPE_UNKNOWN;
	DWORD		lastError;

	errno = 0;

	/*
	 * 当 stdin、stdout 和 stderr 没有关联流时，将返回特殊值 -2：
	 * https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle
	 */
	if (hFile == INVALID_HANDLE_VALUE || hFile == (HANDLE) -2)
	{
		errno = EINVAL;
		return FILE_TYPE_UNKNOWN;
	}

	fileType = GetFileType(hFile);
	lastError = GetLastError();

	/*
	 * 调用 GetLastError 以区分 "有效" 的 FILE_TYPE_UNKNOWN 返回值和由于调用错误而返回的值。在成功的情况下，GetLastError() 返回 NO_ERROR。
	 */
	if (fileType == FILE_TYPE_UNKNOWN && lastError != NO_ERROR)
	{
		_dosmaperr(lastError);
		return FILE_TYPE_UNKNOWN;
	}

	return fileType;
}

#endif							/* WIN32 */
